////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: ParameterParser V1.1.4
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  parameterfilesymboltable.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef PARAMETERSYMBOLTABLE_H
#define PARAMETERSYMBOLTABLE_H

#include "parametertypes.h"
#include "parameterfilesymboltableentry.h"
#include "parametermodule.h"

class ParameterFileSymbolTable
{
public:

    ParameterFileSymbolTable()
    {
        m_entries = NULL;
        m_modules = NULL;
    }

    ~ParameterFileSymbolTable()
    {
        if (m_entries != NULL)
        {
            PARAMETER_DELETE[] m_entries;
        }

        if (m_modules != NULL)
        {
            PARAMETER_DELETE[] m_modules;
        }
    }

    BOOL Load(
        BYTE*   buffer,
        UINT64  length,
        UINT32  tableSize,
        UINT64* pos,
        UINT32  dataOffset)
    {
        m_count = tableSize / ParameterFileSymbolTableEntry::SYMBOL_ENTRY_SIZE;

        UINT32 expected = m_count * ParameterFileSymbolTableEntry::SYMBOL_ENTRY_SIZE;
        BOOL   valid    = tableSize == expected;

        // Validate symbol table size
        if (valid)
        {
            m_moduleCount = 0;
            m_entries     = PARAMETER_NEW ParameterFileSymbolTableEntry[m_count];

            valid = m_entries != NULL;

            for (UINT32 i = 0; valid && i < m_count; i++)
            {
                m_entries[i].Init(this);
                valid = valid && m_entries[i].Load(buffer, length, pos, dataOffset);
                if (valid && m_entries[i].IsModule())
                {
                    m_moduleCount++;
                }
            }

            if (!valid)
            {
                m_moduleCount = 0;
            }

            if (m_moduleCount > 0)
            {
                UINT32 module = 0;
                m_modules = PARAMETER_NEW ParameterFileSymbolTableEntry*[m_moduleCount];

                valid = m_modules != NULL;

                for (UINT32 i = 0; valid && i < m_count; i++)
                {
                    if (m_entries[i].IsModule())
                    {
                        m_modules[module++] = &m_entries[i];
                    }
                }
            }
        }

        return valid;
    }

    inline ParameterFileSymbolTableEntry* GetModule(
        UINT32 index)
    {
        if (index < m_moduleCount)
        {
            return m_modules[index];
        }
        else
        {
            return NULL;
        }
    }

    UINT32 Count()
    {
        return m_count;
    }

    UINT32 ModuleCount()
    {
        return m_moduleCount;
    }

    ParameterFileSymbolTableEntry* Find(
        UINT32 id)
    {
        ParameterFileSymbolTableEntry* result = NULL;

        for (UINT32 i = 0; result == NULL && i < m_count; i++)
        {
            if (m_entries[i].ID == id)
            {
                result = &m_entries[i];
            }
        }

        return result;
    }

    ParameterFileSymbolTableEntry* ReadPointerEntry(
        ParameterFileSymbolTableEntry* entry)
    {
        UINT32 id = 0;

        if (entry->ReadUInt32(&id))
        {
            return Find(id);
        }
        return NULL;
    }


private:
    UINT32                          m_count;
    UINT32                          m_moduleCount;
    ParameterFileSymbolTableEntry** m_modules;
    ParameterFileSymbolTableEntry*  m_entries;
};

#endif

